var gulp         = require('gulp');
// Browsersync能让浏览器实时、快速响应您的文件更改（html、js、css、sass、less等）并自动刷新页面。
var browserSync  = require('browser-sync').create(); // 创建Browsersync实例
var SSI          = require('browsersync-ssi');
// 同步执行任务 -- gulp 的任务的执行是异步的。 
var runSequence  = require('run-sequence');
var rev          = require('gulp-rev');
var revCollector = require('gulp-rev-collector');

// 配置文件
var config       = require('./config');
var clean        = require('gulp-clean');
var sass         = require('gulp-sass');
var fileinclude  = require('gulp-file-include');

gulp.task('reload', function () {
    browserSync.reload(config.dest);
})

gulp.task('server', function() {
    // BrowserSync 监听 dist 目录
    browserSync.init({
        server: {
            baseDir:[config.dest],
            middleware:SSI({
                baseDir: config.dest,
                ext: '.shtml',
                version: '2.10.0'
            })
        }
    });
    gulp.watch(config.scss.all).on('change', function () {
        runSequence("cleanClass", ["copy"],["revCss"],["assetRev"],["revHtml"], "reload");
    });
    gulp.watch(config.src + "/*").on('change', function () {
        runSequence("clean", ["copy","html","fileinclude", "revCss","revImg","revJs"],["assetRev"],["revHtml"], "reload");
    });
});
gulp.task('copy',function(){
    gulp.src('src/css/font/**/*')
        .pipe(gulp.dest('dist/css/font'));
});
gulp.task("cleanClass", function() {
    return gulp.src([config.scss.dest], {read: false})
        .pipe(clean());
});

//为css中引入的图片/字体等添加hash编码
gulp.task('assetRev', function(){
    return gulp.src(['dist/rev/img/*.json', 'dist/css/**/*.css'])   //该任务针对的文件
        .pipe(revCollector())  //- 执行文件内css名的替换
        .pipe(gulp.dest(config.scss.dest));
});

gulp.task("sass", function() {
    return gulp.src(config.scss.all)
        .pipe(sass().on("error", sass.logError))
        .pipe(gulp.dest(config.scss.dest));
 });

gulp.task('fileinclude', function() {
    // 适配所有文件夹下的所有html，排除page下的include文件夹中html
    gulp.src([config.html.src,config.html.ignore])
        .pipe(fileinclude({
            prefix: '@@',
            basepath: '@file'
        }))
        .pipe(gulp.dest('dist'));
});

// 清空目标文件
gulp.task('clean', function () {
    return gulp.src([config.dest], {read: false})
        .pipe(clean());
});

// Img生成文件hash编码 并 生成 rev-manifest.json文件名对照映射
gulp.task('revImg', function() {
    return gulp.src(config.rev.revImg.src)
        .pipe(rev()) // 设置 hash 值
        .pipe(gulp.dest(config.rev.revImg.dest))
        .pipe(rev.manifest()) // 生产 hash 值得 json 文件
        .pipe(gulp.dest(config.rev.revImg.revDest)); // 保存 hash 值得 json 文件
});
// CSS生成文件hash编码 并 生成 rev-manifest.json文件名对照映射
gulp.task('revCss', function() {
    return gulp.src(config.scss.all)
        .pipe(sass())
        .pipe(rev()) // 设置 hash 值
        .pipe(gulp.dest(config.rev.revCss.dest))
        .pipe(rev.manifest()) // 生产 hash 值得 json 文件
        .pipe(gulp.dest(config.rev.revCss.revDest)); // 保存 hash 值得 json 文件
});
// js生成文件hash编码 并 生成 rev-manifest.json文件名对照映射
gulp.task('revJs', function() {
    return gulp.src(config.rev.revJs.src)
        .pipe(rev()) // 设置 hash 值
        .pipe(gulp.dest(config.rev.revJs.dest))
        .pipe(rev.manifest())
        .pipe(gulp.dest(config.rev.revJs.revDest));
});

// 处理 html 文件
gulp.task('html', function() {
    return gulp.src([config.html.dest,config.html.ignore])
        .pipe(gulp.dest(config.html.dest))
});

//Html替换css、js文件版本
gulp.task('revHtml', function () {
    return gulp.src([config.dest+"/rev/**/*.json", config.dest+"/*.html"])
        .pipe(revCollector({ // Html -- 替换 css、js文件版本
            replaceReved: true
        }))
        .pipe(gulp.dest(config.dest));
});

// build 构建
gulp.task('build', function (done) {
    runSequence("clean", ["html", "fileinclude", "revCss","revImg","revJs"],["assetRev"],["revHtml"], done);
});


// 开发 dev 构建
gulp.task('dev', function (done) {
    runSequence("clean", ["html", "fileinclude", "revCss","revImg","revJs"],["assetRev"],["revHtml"], "server");
});

// 编辑默认任务
gulp.task('default', ['dev']);
